package com.soccerlover.strictfield.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 指定 标注字段{@link StrictField} 需要匹配的值
 *
 * @author hck soccerlover9527@gmail.com
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckTarget {

    /**
     * 如果是普通对象,则匹配普通对象的属性值.例如该字段必须是一个 User 对象里面的属性名.
     * Class User {
     * private String name;
     * private int age;
     * }
     * 该字段必须是 name 或者 age.
     * <p>
     * 如果是枚举对象,则该字段必须是枚举对象的名称
     */
    Class<?> value() default NULL.class;

    /**
     * 不需要校验的字段,如果填写了该字段则根据该字段过滤
     *
     * @return fields do not need check
     */
    String[] exclude() default {};

    /**
     * 是否将该类的父类字段也纳入校验值.
     */
    boolean supperClassValue() default false;

    String[] stringValuesList() default {};

    int[] intValuesList() default {};

    long[] longValuesList() default {};

    byte[] byteValuesList() default {};
}
